package com.qkjia.mvc.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * @author zhaoqiankun
 * @date 2021/9/6
 * @RequestMapping注解的value属性
 */
@Controller
//@RequestMapping("/hello")
public class RequestMappingController {

    /**
     * 注：
     * 1、对于处理指定请求方式的控制器方法，SpringMVC中提供了@RequestMapping的派生注解
     * 处理get请求的映射-->@GetMapping
     * 处理post请求的映射-->@PostMapping
     * 处理put请求的映射-->@PutMapping
     * 处理delete请求的映射-->@DeleteMapping
     * 2、常用的请求方式有get，post，put，delete
     * 但是目前浏览器只支持get和post，若在form表单提交时，为method设置了其他请求方式的字符
     * 串（put或delete），则按照默认的请求方式get处理
     * 若要发送put和delete请求，则需要通过spring提供的过滤器HiddenHttpMethodFilter，在
     * RESTful部分会讲到
     * @return success视图
     */
    @RequestMapping(
            value = {"/testRequestMapping", "test"},
            method = {RequestMethod.GET,RequestMethod.POST})
    public String testRequestMapping() {
        return "success";
    }



    //    配上@RequestMapping("/hello")
    @GetMapping("/testGetMapping")
    public String testGetMapping(){
        return "success";
    }


    /**
     * @return success视图
     * @RequestMapping注解的params属性（了解）
     * @RequestMapping注解的params属性通过请求的请求参数匹配请求映射
     * @RequestMapping注解的params属性是一个字符串类型的数组，可以通过四种表达式设置请求参数 和请求映射的匹配关系
     * "param"：要求请求映射所匹配的请求必须携带param请求参数
     * "!param"：要求请求映射所匹配的请求必须不能携带param请求参数
     * "param=value"：要求请求映射所匹配的请求必须携带param请求参数且param=value
     * "param!=value"：要求请求映射所匹配的请求必须携带param请求参数但是param!=value
     */
    @RequestMapping(
            value = {"/testRequestMapping", "test"},
            method = {RequestMethod.GET, RequestMethod.POST},
            params = {"username", "password!=123456"})
    public String testRequestMapping01() {
        return "success";
    }


    /**
     * 发送PUT请求
     * @return
     */
    @RequestMapping(value = "/testPut", method = RequestMethod.PUT)
    public String testPut(){
        return "success";
    }

    /**
     * @RequestMapping注解的headers属性（了解）
     * @RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射
     * @RequestMapping注解的headers属性是一个字符串类型的数组，可以通过四种表达式设置请求头信
     * 息和请求映射的匹配关系
     * "header"：要求请求映射所匹配的请求必须携带header请求头信息
     * "!header"：要求请求映射所匹配的请求必须不能携带header请求头信息
     * "header=value"：要求请求映射所匹配的请求必须携带header请求头信息且header=value
     * "header!=value"：要求请求映射所匹配的请求必须携带header请求头信息且header!=value
     * 若当前请求满足@RequestMapping注解的value和method属性，但是不满足headers属性，此时页面
     * 显示404错误，即资源未找到
     * @return
     */
    @RequestMapping(
            value = "/testParamsAndHeaders",
            params = {"username","password!=123456"},
            headers = {"Host=localhost:8080"}
    )
    public String testParamsAndHeaders(){
        return "success";
    }

    /**
     * SpringMVC支持ant风格的路径
     * <a th:href="@{/test(username='admin',password=123456)">
     *     测试@RequestMapping的 params属性-->/test</a><br>
     * @RequestMapping( value = {"/testRequestMapping", "/test"} ,
     * method = {RequestMethod.GET, RequestMethod.POST} ,
     * params = {"username","password!=123456"} )
     * public String testRequestMapping(){ return "success"; }
     * ？：表示任意的单个字符
     * *：表示任意的0个或多个字符
     * **：表示任意的一层或多层目录
     * 注意：在使用**时，只能使用/**xxx的方式
     * @return
     */
    //@RequestMapping("/a?a/testAnt")
    //@RequestMapping("/a*a/testAnt")
    @RequestMapping("/**/testAnt")
    public String testAnt(){
        return "success";
    }

    @RequestMapping("/testPath/{id}/{username}")
    public String testPath(@PathVariable("id")Integer id, @PathVariable("username") String username){
        System.out.println("id:"+id+",username:"+username);
        return "success";
    }


}
